home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / BORLAND TURBO / ROWLST.PAK / RLISTVW.CPP < prev    next >
C/C++ Source or Header  |  1997-05-06  |  10KB  |  394 lines

  1. // RListVw.cpp : implementation of the CRowListView class
  2. //
  3. // This is a part of the Microsoft Foundation Classes C++ library.
  4. // Copyright (C) 1992-1996 Microsoft Corporation
  5. // All rights reserved.
  6. //
  7. // This source code is only intended as a supplement to the
  8. // Microsoft Foundation Classes Reference and related
  9. // electronic documentation provided with the library.
  10. // See these sources for detailed information regarding the
  11. // Microsoft Foundation Classes product.
  12.  
  13. #include "stdafx.h"
  14. #include "RowList.h"
  15.  
  16. #include "RListDoc.h"
  17.  
  18. #include "ListVwEx.h"    // base class for CRowListView
  19. #include "RListVw.h"
  20.  
  21. #ifdef _DEBUG
  22. #define new DEBUG_NEW
  23. #undef THIS_FILE
  24. static char THIS_FILE[] = __FILE__;
  25. #endif
  26.  
  27. /////////////////////////////////////////////////////////////////////////////
  28. // CRowListView
  29.  
  30. IMPLEMENT_DYNCREATE(CRowListView, CListViewEx)
  31.  
  32. BEGIN_MESSAGE_MAP(CRowListView, CListViewEx)
  33.     //{{AFX_MSG_MAP(CRowListView)
  34.     ON_COMMAND(ID_VIEW_SMALLICONS, OnViewSmallIcons)
  35.     ON_COMMAND(ID_VIEW_LARGEICONS, OnViewLargeIcons)
  36.     ON_COMMAND(ID_VIEW_LIST, OnViewList)
  37.     ON_COMMAND(ID_VIEW_DETAILS, OnViewDetails)
  38.     ON_COMMAND(ID_VIEW_ROWDETAILS, OnViewFullRowDetails)
  39.     ON_UPDATE_COMMAND_UI(ID_VIEW_SMALLICONS, OnUpdateViewSmallIcons)
  40.     ON_UPDATE_COMMAND_UI(ID_VIEW_LARGEICONS, OnUpdateViewLargeIcons)
  41.     ON_UPDATE_COMMAND_UI(ID_VIEW_LIST, OnUpdateViewList)
  42.     ON_UPDATE_COMMAND_UI(ID_VIEW_DETAILS, OnUpdateViewDetails)
  43.     ON_UPDATE_COMMAND_UI(ID_VIEW_ROWDETAILS, OnUpdateViewFullRowDetails)
  44.     ON_COMMAND(ID_VIEW_STATEICONS, OnViewStateIcons)
  45.     ON_UPDATE_COMMAND_UI(ID_VIEW_STATEICONS, OnUpdateViewStateIcons)
  46.     ON_COMMAND(ID_VIEW_CLIENTWIDTHSEL, OnViewClientWidthSel)
  47.     ON_UPDATE_COMMAND_UI(ID_VIEW_CLIENTWIDTHSEL, OnUpdateViewClientWidthSel)
  48.     ON_WM_LBUTTONDOWN()
  49.     ON_WM_LBUTTONDBLCLK()
  50.     //}}AFX_MSG_MAP
  51. END_MESSAGE_MAP()
  52.  
  53. /////////////////////////////////////////////////////////////////////////////
  54. // CRowListView construction/destruction
  55.  
  56. CRowListView::CRowListView()
  57. {
  58.     m_bStateIcons=TRUE;
  59.     m_nCheckedItem=-1;
  60.     m_hSmallIcon=NULL;
  61.     m_hLargeIcon=NULL;
  62. }
  63.  
  64. CRowListView::~CRowListView()
  65. {
  66. }
  67.  
  68. BOOL CRowListView::PreCreateWindow(CREATESTRUCT& cs)
  69. {
  70.     cs.style|= LVS_SHOWSELALWAYS | LVS_REPORT;
  71.  
  72.     return CListViewEx::PreCreateWindow(cs);
  73. }
  74.  
  75. /////////////////////////////////////////////////////////////////////////////
  76. // data for the list view control
  77.  
  78. #define NUM_COLUMNS    8
  79. #define NUM_ITEMS    7
  80.  
  81. static _TCHAR *_gszColumnLabel[NUM_COLUMNS]=
  82. {
  83.     _T("Color"), _T("Red"), _T("Green"), _T("Blue"), _T("Hue"), _T("Sat"), _T("Lum"), _T("Type")
  84. };
  85.  
  86. static int _gnColumnFmt[NUM_COLUMNS]=
  87. {
  88.     LVCFMT_LEFT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT,
  89.         LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_RIGHT, LVCFMT_CENTER
  90. };
  91.  
  92. static int _gnColumnWidth[NUM_COLUMNS]=
  93. {
  94.     150, 50, 50, 50, 100, 50, 50, 150
  95. };
  96.  
  97. static _TCHAR *_gszItem[NUM_ITEMS][NUM_COLUMNS]=
  98. {
  99.     _T("Yellow"),  _T("255"), _T("255"), _T("0"),   _T("40"),  _T("240"), _T("120"), _T("Neutral"),
  100.     _T("Red"),     _T("255"), _T("0"),   _T("0"),   _T("0"),   _T("240"), _T("120"), _T("Warm"),
  101.     _T("Green"),   _T("0"),   _T("255"), _T("0"),   _T("80"),  _T("240"), _T("120"), _T("Cool"),
  102.     _T("Magenta"), _T("255"), _T("0"),   _T("255"), _T("200"), _T("240"), _T("120"), _T("Warm"),
  103.     _T("Cyan"),    _T("0"),   _T("255"), _T("255"), _T("120"), _T("240"), _T("120"), _T("Cool"),
  104.     _T("Blue"),    _T("0"),   _T("0"),   _T("255"), _T("160"), _T("240"), _T("120"), _T("Cool"),
  105.     _T("Gray"),    _T("192"), _T("192"), _T("192"), _T("160"), _T("0"),   _T("181"), _T("Neutral")
  106. };
  107.  
  108. /////////////////////////////////////////////////////////////////////////////
  109. // CRowListView initialization
  110.  
  111. void CRowListView::OnInitialUpdate()
  112. {
  113.     CListViewEx::OnInitialUpdate();
  114.  
  115.     CListCtrl& ListCtrl=GetListCtrl();
  116.  
  117. // set image lists
  118.  
  119.     m_LargeImageList.Create(IDB_LARGEICONS,32,1,RGB(255,255,255));
  120.     m_SmallImageList.Create(IDB_SMALLICONS,16,1,RGB(255,255,255));
  121.     m_StateImageList.Create(IDB_STATEICONS,16,1,RGB(255,0,0));
  122.  
  123.     m_LargeImageList.SetOverlayImage(NUM_ITEMS,1);
  124.     m_SmallImageList.SetOverlayImage(NUM_ITEMS,1);
  125.  
  126.     ListCtrl.SetImageList(&m_LargeImageList,LVSIL_NORMAL);
  127.     ListCtrl.SetImageList(&m_SmallImageList,LVSIL_SMALL);
  128.     ListCtrl.SetImageList(&m_StateImageList,LVSIL_STATE);
  129.  
  130. // insert columns
  131.  
  132.     int i, j;
  133.     LV_COLUMN lvc;
  134.  
  135.     lvc.mask=LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
  136.  
  137.     for(i=0; i<NUM_COLUMNS; i++)
  138.     {
  139.         lvc.iSubItem=i;
  140.         lvc.pszText=_gszColumnLabel[i];
  141.         lvc.cx=_gnColumnWidth[i];
  142.         lvc.fmt=_gnColumnFmt[i];
  143.         ListCtrl.InsertColumn(i,&lvc);
  144.     }
  145.  
  146. // insert items
  147.  
  148.     LV_ITEM lvi;
  149.  
  150.     for(i=0; i<NUM_ITEMS; i++)
  151.     {
  152.         lvi.mask=LVIF_TEXT | LVIF_IMAGE | LVIF_STATE;
  153.         lvi.iItem=i;
  154.         lvi.iSubItem=0;
  155.         lvi.pszText=_gszItem[i][0];
  156.         lvi.iImage=i;
  157.         lvi.stateMask=LVIS_STATEIMAGEMASK;
  158.         lvi.state=INDEXTOSTATEIMAGEMASK(1);
  159.  
  160.         ListCtrl.InsertItem(&lvi);
  161.     }
  162.  
  163. // set item text for additional columns
  164.  
  165.     for(i=0; i<NUM_ITEMS; i++) for(j=1; j<NUM_COLUMNS; j++)
  166.         ListCtrl.SetItemText(i,j,_gszItem[i][j]);
  167. }
  168.  
  169. /////////////////////////////////////////////////////////////////////////////
  170. // CRowListView diagnostics
  171.  
  172. #ifdef _DEBUG
  173. void CRowListView::AssertValid() const
  174. {
  175.     CListViewEx::AssertValid();
  176. }
  177.  
  178. void CRowListView::Dump(CDumpContext& dc) const
  179. {
  180.     CListViewEx::Dump(dc);
  181. }
  182.  
  183. CRowListDoc* CRowListView::GetDocument() // non-debug version is inline
  184. {
  185.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CRowListDoc)));
  186.     return (CRowListDoc*)m_pDocument;
  187. }
  188. #endif //_DEBUG
  189.  
  190. /////////////////////////////////////////////////////////////////////////////
  191. // CRowListView helpers
  192.  
  193. BOOL CRowListView::SetViewType(DWORD dwViewType)
  194. {
  195.     return(ModifyStyle(LVS_TYPEMASK,dwViewType & LVS_TYPEMASK));
  196. }
  197.  
  198. DWORD CRowListView::GetViewType()
  199. {
  200.     return(GetStyle() & LVS_TYPEMASK);
  201. }
  202.  
  203. void CRowListView::CheckItem(int nNewCheckedItem)
  204. {
  205.     CListCtrl& ListCtrl=GetListCtrl();
  206.  
  207. // reset if there is checked item
  208.  
  209.     if(m_nCheckedItem!=-1)
  210.     {
  211.         if(m_bStateIcons)
  212.             ListCtrl.SetItemState(m_nCheckedItem,
  213.                 INDEXTOSTATEIMAGEMASK(1),LVIS_STATEIMAGEMASK);
  214.         else
  215.             ListCtrl.SetItemState(m_nCheckedItem,
  216.                 INDEXTOSTATEIMAGEMASK(1),LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
  217.  
  218.         ::DestroyIcon(m_hSmallIcon);
  219.         ::DestroyIcon(m_hLargeIcon);
  220.     }
  221.  
  222. // check new item and set its icon as the app icon
  223.  
  224.     CWnd* pMainWnd=AfxGetMainWnd();
  225.  
  226.     if(m_nCheckedItem==nNewCheckedItem)
  227.     {
  228.         m_nCheckedItem=-1;
  229.         pMainWnd->SetIcon(NULL,FALSE);
  230.         pMainWnd->SetIcon(NULL,TRUE);
  231.     }
  232.     else if((m_nCheckedItem=nNewCheckedItem)!=-1)
  233.     {
  234.         if(m_bStateIcons)
  235.             ListCtrl.SetItemState(m_nCheckedItem,
  236.                 INDEXTOSTATEIMAGEMASK(2),LVIS_STATEIMAGEMASK);
  237.         else
  238.             ListCtrl.SetItemState(m_nCheckedItem,
  239.                 INDEXTOSTATEIMAGEMASK(2) | INDEXTOOVERLAYMASK(1),
  240.                 LVIS_STATEIMAGEMASK | LVIS_OVERLAYMASK);
  241.  
  242.         m_hSmallIcon=ListCtrl.GetImageList(LVSIL_SMALL)->ExtractIcon(nNewCheckedItem);
  243.         pMainWnd->SetIcon(m_hSmallIcon,FALSE);
  244.         m_hLargeIcon=ListCtrl.GetImageList(LVSIL_NORMAL)->ExtractIcon(nNewCheckedItem);
  245.         pMainWnd->SetIcon(m_hLargeIcon,TRUE);
  246.     }
  247. }
  248.  
  249. /////////////////////////////////////////////////////////////////////////////
  250. // CRowListView message handlers
  251.  
  252. void CRowListView::OnViewSmallIcons() 
  253. {
  254.     if(GetViewType()!=LVS_SMALLICON)
  255.         SetViewType(LVS_SMALLICON);
  256. }
  257.  
  258. void CRowListView::OnViewLargeIcons() 
  259. {
  260.     if(GetViewType()!=LVS_ICON)
  261.         SetViewType(LVS_ICON);
  262. }
  263.  
  264. void CRowListView::OnViewList() 
  265. {
  266.     if(GetViewType()!=LVS_LIST)
  267.         SetViewType(LVS_LIST);
  268. }
  269.  
  270. void CRowListView::OnViewDetails() 
  271. {
  272.     if((GetViewType()!=LVS_REPORT) || GetFullRowSel())
  273.     {
  274.         SetFullRowSel(FALSE);
  275.         if(GetViewType()!=LVS_REPORT)
  276.             SetViewType(LVS_REPORT);
  277.     }
  278. }
  279.  
  280. void CRowListView::OnViewFullRowDetails() 
  281. {
  282.     if((GetViewType()!=LVS_REPORT) || !GetFullRowSel())
  283.     {
  284.         SetFullRowSel(TRUE);
  285.         if(GetViewType()!=LVS_REPORT)
  286.             SetViewType(LVS_REPORT);
  287.     }
  288. }
  289.  
  290. void CRowListView::OnUpdateViewSmallIcons(CCmdUI* pCmdUI) 
  291. {
  292.     pCmdUI->SetCheck(GetViewType()==LVS_SMALLICON);
  293. }
  294.  
  295. void CRowListView::OnUpdateViewLargeIcons(CCmdUI* pCmdUI) 
  296. {
  297.     pCmdUI->SetCheck(GetViewType()==LVS_ICON);
  298. }
  299.  
  300. void CRowListView::OnUpdateViewList(CCmdUI* pCmdUI) 
  301. {
  302.     pCmdUI->SetCheck(GetViewType()==LVS_LIST);
  303. }
  304.  
  305. void CRowListView::OnUpdateViewDetails(CCmdUI* pCmdUI) 
  306. {
  307.     pCmdUI->SetCheck((GetViewType()==LVS_REPORT) && !GetFullRowSel());
  308. }
  309.  
  310. void CRowListView::OnUpdateViewFullRowDetails(CCmdUI* pCmdUI) 
  311. {
  312.     pCmdUI->SetCheck((GetViewType()==LVS_REPORT) && GetFullRowSel());
  313. }
  314.  
  315. void CRowListView::OnViewStateIcons() 
  316. {
  317.     m_bStateIcons=!m_bStateIcons;
  318.  
  319.     CListCtrl& ListCtrl=GetListCtrl();
  320.  
  321.     if(m_bStateIcons)
  322.     {
  323.         ListCtrl.SetImageList(&m_StateImageList,LVSIL_STATE);
  324.         ListCtrl.SetItemState(m_nCheckedItem,0,LVIS_OVERLAYMASK);
  325.     }
  326.     else
  327.     {
  328.         ListCtrl.SetImageList(NULL,LVSIL_STATE);
  329.         if(m_nCheckedItem!=-1)
  330.             ListCtrl.SetItemState(m_nCheckedItem,INDEXTOOVERLAYMASK(1),LVIS_OVERLAYMASK);
  331.     }
  332. }
  333.  
  334. void CRowListView::OnUpdateViewStateIcons(CCmdUI* pCmdUI) 
  335. {
  336.     pCmdUI->SetCheck(m_bStateIcons);
  337. }
  338.  
  339. void CRowListView::OnViewClientWidthSel() 
  340. {
  341.     m_bClientWidthSel=!m_bClientWidthSel;
  342.  
  343.     Invalidate();
  344.     UpdateWindow();
  345. }
  346.  
  347. void CRowListView::OnUpdateViewClientWidthSel(CCmdUI* pCmdUI) 
  348. {
  349.     pCmdUI->SetCheck(m_bClientWidthSel);
  350.     pCmdUI->Enable((GetViewType()==LVS_REPORT) && GetFullRowSel());
  351. }
  352.  
  353. void CRowListView::OnLButtonDown(UINT nFlags, CPoint point) 
  354. {
  355.     UINT uFlags=0;
  356.     int nHitItem=GetListCtrl().HitTest(point,&uFlags);
  357.  
  358.     // we need additional checking in owner-draw mode
  359.     // because we only get LVHT_ONITEM
  360.     BOOL bHit=FALSE;
  361.     if(uFlags==LVHT_ONITEM && (GetStyle() & LVS_OWNERDRAWFIXED))
  362.     {
  363.         CRect rect;
  364.         GetListCtrl().GetItemRect(nHitItem,rect,LVIR_ICON);
  365.  
  366.         // check if hit was on a state icon
  367.         if(m_bStateIcons && point.x<rect.left)
  368.             bHit=TRUE;
  369.     }
  370.     else if(uFlags & LVHT_ONITEMSTATEICON)
  371.         bHit=TRUE;
  372.  
  373.     if(bHit)
  374.         CheckItem(nHitItem);
  375.     else    
  376.         CListViewEx::OnLButtonDown(nFlags, point);
  377. }
  378.  
  379. void CRowListView::OnLButtonDblClk(UINT nFlags, CPoint point) 
  380. {
  381.     UINT uFlags=0;
  382.     int nHitItem=GetListCtrl().HitTest(point,&uFlags);
  383.  
  384.     if(uFlags & LVHT_ONITEM)
  385.     {
  386.         // double click works only if we don't have state icons,
  387.         // or if we are in icon or small icon view
  388.         if(!m_bStateIcons || GetViewType()==LVS_ICON || GetViewType()==LVS_SMALLICON)
  389.             CheckItem(nHitItem);
  390.     }
  391.  
  392.     CListViewEx::OnLButtonDblClk(nFlags, point);
  393. }
  394.